import pyautogui
import pyperclip

import time
import win32con
import win32gui
import ctypes
import ctypes.wintypes


from package.Utils.log import logger,mylog  # 导入 logger 对象(python代码)
# from User_Import import *  # 导入 myWin, screen, logger 对象(python代码)

class MyScreen:
    def __init__(self):
        self.width = 0
        self.height = 0
        self.Mouse_Position_x = 0
        self.Mouse_Position_y = 0
        self.tray = None

    #获取屏幕分辨率
    def get_Screen_ResolutionRatio(self):
        self.width,self.height = pyautogui.size()
        if mylog.log_enabled is True:
            logger.info(f'当前屏幕分辨率为：{screen.width} x {screen.height}')

    #获取鼠标坐标
    def get_Mouse_Position(self):
        self.Mouse_Position_x,self.Mouse_Position_y = pyautogui.position()
        if mylog.log_enabled is True:
            logger.info(f'当前鼠标位置为：{self.Mouse_Position_x,self.Mouse_Position_y}')

    #控制鼠标点击
    def Control_Mouse_Click(self,x,y):
        pyautogui.click(x,y)

    #复制
    def Copy(self,words):
        pyperclip.copy(words)

    #粘贴
    def Paste(self):
        pyautogui.hotkey('ctrl', 'v')

    #控制键盘输入
    def Control_Keyboard_Input(self,words):
        pyautogui.typewrite(words)

    #获取键盘输入
    def Get_Keyboard_Input(self):
        return pyperclip.paste()

    #使用快捷键
    def Use_Shortcut(self,shortcut):
        pyautogui.hotkey(*shortcut.split("+"))

    #查询 窗口状态
    def get_window_status(self,hwnd):
        """返回详细窗口状态（支持8种状态判断）"""
        if not win32gui.IsWindow(hwnd):
            return "无效句柄"

        placement = win32gui.GetWindowPlacement(hwnd)
        show_cmd = placement[1]

        status_map = {
            win32con.SW_HIDE: "隐藏",
            win32con.SW_SHOWNORMAL: "正常显示",
            win32con.SW_SHOWMINIMIZED: "最小化",
            win32con.SW_SHOWMAXIMIZED: "最大化",
            win32con.SW_SHOWNOACTIVATE: "非激活显示",
            win32con.SW_SHOW: "默认显示",
            win32con.SW_MINIMIZE: "最小化",
            win32con.SW_SHOWMINNOACTIVE: "最小化(非激活)"
        }
        return status_map.get(show_cmd,  "未知状态")

    #控制 隐藏或显示窗口
    def control_window(self,hwnd, action):
        """
        参数说明：
        hwnd：目标窗口句柄（可通过win32gui.FindWindow获取）
        action：操作类型（'hide'隐藏 / 'show'恢复）
        """
        cmd = {
            'hide': win32con.SW_HIDE,
            'show': win32con.SW_SHOWNOACTIVATE
        }[action]
        win32gui.ShowWindow(hwnd, cmd)
        if cmd == win32con.SW_HIDE:
            # 移除任务栏显示属性
            self.ex_style = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
            self.new_style = self.ex_style & ~win32con.WS_EX_TOOLWINDOW
            win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE,self.new_style)
        else:
            win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE,self.ex_style)

    #控制 隐藏或显示窗口标题栏
    def control_window_title(self,hwnd, action):
        if action == 'hide':
            win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE) & ~win32con.WS_CAPTION)
        elif action =='show':
            win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE) | win32con.WS_CAPTION)
        # 调整窗口大小以适应新的样式
        win32gui.SetWindowPos(hwnd, 0, 0, 0, 0, 0,
                            win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | win32con.SWP_FRAMECHANGED)

    #控制 隐藏或显示窗口滚动条
    def control_window_scrollbar(self,hwnd, action):
        # 获取当前窗口样式
        current_style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)

        if action == 'hide':
            # 移除垂直和水平滚动条样式
            new_style = current_style & ~win32con.WS_VSCROLL & ~win32con.WS_HSCROLL
            # 应用新样式
            win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, new_style)
            #强制窗口重绘以应用样式更改
            win32gui.SetWindowPos(
                hwnd,
                0,  # 保持Z顺序不变
                0, 0, 0, 0,  # 不改变位置和大小
                win32con.SWP_NOMOVE | win32con.SWP_NOSIZE |
                win32con.SWP_NOZORDER | win32con.SWP_FRAMECHANGED
            )
        elif action =='show':
            # 添加垂直和水平滚动条样式
            new_style = current_style | win32con.WS_VSCROLL | win32con.WS_HSCROLL
            # 应用新样式
            win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, new_style)
            #强制窗口重绘以应用样式更改
            win32gui.SetWindowPos(
                hwnd,
                0,  # 保持Z顺序不变
                0, 0, 0, 0,  # 不改变位置和大小
                win32con.SWP_NOMOVE | win32con.SWP_NOSIZE |
                win32con.SWP_NOZORDER | win32con.SWP_FRAMECHANGED
            )

screen = MyScreen()  # 实例化 MyScreen 类


from PyQt5.QtWidgets import QApplication, QLineEdit, QWidget, QVBoxLayout
from PyQt5.QtCore import QObject, Qt, QEvent

class KeyboardFilter(QObject):
    """事件过滤器：捕获快捷键并显示"""
    MODIFIERS = {
        Qt.ControlModifier: "Ctrl+",
        Qt.AltModifier: "Alt+",
        Qt.ShiftModifier: "Shift+",
        Qt.MetaModifier: "Meta+"
    }
    SPECIAL_KEYS = {
        Qt.Key_Space: "Space",
        Qt.Key_Enter: "Enter",
        Qt.Key_Return: "Enter",
        Qt.Key_Escape: "Esc"
    }

    def eventFilter(self, obj, event):
        if event.type()  == QEvent.KeyPress:
            # 解析按键组合
            modifiers = event.modifiers()
            key = event.key()

            # 排除单独修饰键
            if key in (Qt.Key_Control, Qt.Key_Alt, Qt.Key_Shift, Qt.Key_Meta):
                return False

            # 生成快捷键字符串
            shortcut = self._parse_shortcut(modifiers, key)
            if shortcut:
                obj.setText(shortcut)
                return True  # 阻止默认输入行为

        return super().eventFilter(obj, event)

    def _parse_shortcut(self, modifiers, key):
        """将Qt键值转换为可读字符串"""
        modifier_str = "".join([self.MODIFIERS[mod] for mod in self.MODIFIERS if modifiers & mod])

        if key in self.SPECIAL_KEYS:
            key_str = self.SPECIAL_KEYS[key]
        elif 32 <= key <= 126:  # 可打印ASCII字符
            key_str = chr(key).upper() if modifiers & Qt.ShiftModifier else chr(key)
        else:
            key_str = ""

        return modifier_str + key_str if key_str else ""

# 安装事件过滤器
filter = KeyboardFilter()

import pynput.keyboard
# 监听键盘快捷键
# 配置目标快捷键（支持任意组合）
# TARGET_HOTKEYS = {keyboard.Key.ctrl_l, keyboard.KeyCode.from_char('f')}
class HotkeyDetector:
    def __init__(self):
        self.pressed_keys = set()
        self.last_trigger_time  = 0
        self.listener  = None # keyboard.Listener(on_press=self.on_press,  on_release=self.on_release)

    def on_press(self, key):
        """记录按下按键"""
        self.pressed_keys.add(key)
        self.check_hotkey()
        # if mylog.log_enabled is True:
        #     logger.info(f"按下按键：{key}")

    def on_release(self, key):
        """移除释放按键"""
        self.pressed_keys.discard(key)
        # if mylog.log_enabled is True:
        #     logger.info(f"释放按键：{key}")

    def check_hotkey(self):
        """验证快捷键并执行操作（含500ms防抖）"""
        Shortcut_key_Num1 = None
        from package.Utils.MainWindow import mywinutils  # 导入 mywinutils 对象(python代码)
        if not mywinutils.Shortcut_key_list:
            return
        if mywinutils.Shortcut_key_list[0] == 'Ctrl':
            Shortcut_key_Num1 = pynput.keyboard.Key.ctrl_l
        elif mywinutils.Shortcut_key_list[0] == 'Alt':
            Shortcut_key_Num1 = pynput.keyboard.Key.alt_l
        TARGET_HOTKEYS = {Shortcut_key_Num1, pynput.keyboard.KeyCode.from_char(f'{mywinutils.Shortcut_key_list[1]}')}
        if TARGET_HOTKEYS.issubset(self.pressed_keys):
            current_time = time.time()
            if current_time - self.last_trigger_time  > 0.5:
                self.execute_action()
                self.last_trigger_time  = current_time

    def execute_action(self):
        """自定义触发逻辑"""
        from package.Utils.MainWindow import mywinutils  # 导入 mywinutils 对象(python代码)
        print(f"快捷键触发：{mywinutils.Shortcut_key_list[0]}+{mywinutils.Shortcut_key_list[1]}")
        self.pressed_keys.clear()  # 强制清空按键状态
        # 此处添加业务逻辑，如截图、保存等操作
        if mywinutils.window_hwnd_States == True:
            screen.control_window(mywinutils.hwnd, 'hide')  # 隐藏窗口
            mywinutils.window_hwnd_States = False  # 窗口状态修改
        else:
            screen.control_window(mywinutils.hwnd, 'show')  # 显示窗口
            mywinutils.window_hwnd_States = True  # 窗口状态修改



    def start(self):
        """启动监听"""
        if self.listener and self.listener.is_alive():
            print("监听器已在运行")
            return

        # 创建全新监听器实例（关键点）
        self.listener  = pynput.keyboard.Listener(
            on_press=self.on_press,
            on_release=self.on_release
        )
        self.listener.start()

    def stop(self):
        """停止监听"""
        if self.listener  and self.listener.is_alive():
            self.listener.stop()   # 安全终止线程
            self.listener  = None  # 解除引用

hotkey = HotkeyDetector()